docs(cli): state the per-package dedup bound the CLI actually holds in #18677 / #18778 pending changesets - #19531
Conversation
…#18677 / #18778's pending changesets Both entries asserted "exactly the set the union could not see" and attributed it to source text that now explicitly forbids restating it (packages/cli/src/commands/compile.ts:457-470 and packages/cli/src/utils/artifact-packages.ts:236-246). A changeset body ships verbatim into packages/cli/CHANGELOG.md, and both entries are still pending, so the correction costs a diff today and a published falsehood after the next release. Each now states the settled bound in the source's own words -- the per-package findings no union finding already carried under the same rule, `where`, message and non-top-level position -- together with the narrowness caveat those docblocks give for it: two entries rendering the same `where` still collapse. Prose only; no code path changes. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QCdUBjM47SxioST9z5Zwdf
|
Maintainer confirmation received — the route-0 written confirmation this class requires
1. The notes, and what changed under eachBoth files are somebody else's pending release notes. Neither is this PR's own release; this PR adds no changeset of its own.
Nothing else moves:
2. The confirmation, quoted rather than paraphrasedGiven by the maintainer in session on 2026-09-22, in answer to this seat's naming of the two notes and the pre-check:
Two acts, and both were needed: (a) the notes may be corrected in place, and (b) landing pre-check ③ is waived for 3. The three red-with-enqueue conditions, each measured on this head
CI on
⛔ Stated rather than assumed: 4. What this seat does nextPre-check ① is not owed ( Generated by Claude Code |
Correction to §2 of
|
Fixes #19245
Clause-②: no
Two pending, unreleased changesets each asserted the sentence
packages/cli's own source now explicitly forbids restating, and each attributed it to that source. A changeset body ships verbatim intopackages/cli/CHANGELOG.md, so this correction costs a diff today and a published falsehood after the release that consumes them. Prose only — two.changeset/*.mdfiles, no code path changes, no export, no key, no accept set moved.The two shas this diff is actually between: merge base
eec56c37dfc89086658c1659bb2da869dfa08d4f(the tip oforigin/mainat branch time and at every measurement below) → head2babd1876786eb135509df70ab4fc2ee0113a7f3. Verified withgit merge-base origin/main HEAD, not assumed from the branch point.1. The settled bound, read at the head this branch points at
⛔ No fourth phrasing was invented. Both replacement sentences are the tree's own, read from the two docblocks the card names:
packages/cli/src/commands/compile.ts:465-470packages/cli/src/utils/artifact-packages.ts:237-244Both halves are carried into both entries: the bound, and the reason it is narrower (two entries rendering the same
wherestill collapse). An amended note that stated the bound and dropped the caveat would be the same defect one notch smaller, so neither entry drops it.CHANGELOG.md, which is the entire cost this card exists to avoid — and it would leave the population sweep in §3 reading 3 again.2. What each entry now says
.changeset/18677-validate-per-package-authoring-pass.md:7compile.ts' own description the survivors of that second pass are «exactly the set the union could not see», so that whole set was findingsos buildreported andos validatestructurally could not."compile.ts' own description the survivors of that second pass are the per-package findings no union finding already carried under the same rule,where, message and non-top-level position — deliberately narrower than everything the union run missed, because two entries rendering the samewherestill collapse. That whole set was findingsos buildreported andos validatestructurally could not.".changeset/18778-lint-per-package-authoring-pass.md:10-13where, message and non-top-level position — was reported by the command that ships and invisible on the fastest of the three doors. That bound is deliberately narrower than everything the union run missed: two entries rendering the samewherestill collapse."Both attributions are now accurate:
compile.tsdoes say the replacement, in those words. The downstream conclusion each entry draws is untouched and still holds — a survivor is by construction something the union run did not report, so it remains a findingos buildreported and the other door structurally could not. Only the size claimed for that set moves, which is exactly the correction #18779 landed in the code and did not reach these two notes.⭐ One correction, not two. The two entries needed the same substantive change; only the sentence surgery differed, because one file is unwrapped prose and the other is hard-wrapped at 80 columns. Each file's own wrapping convention is preserved.
⭐ The
**BREAKING**section PR #18867 just added to18677-…mdis not touched. The assertion sits at:7; that banner and its table occupy:22-29.git diffshows one changed line in that file.3. The sweep over the whole
.changeset/population, with lit controls\s+only. That is enough for markdown, but inside a block comment the sentence's line wrap carries a*continuation marker, so a bare\s+bridge does not join"exactly thetoset the union could not see". On the tree scan in §4 it silently undercounted 13 → 11. The corrected normaliser strips each line's comment-continuation prefix (*,//,#) before collapsing whitespace. Every number below is from the corrected instrument; both are kept in the report.Whole population, whitespace-normalised, case-insensitive, every hit opened:
.changeset/@origin/maineec56c37df(before).changeset/@ head2babd18767(after)The three before, each opened, ⛔ not counted:
18677-…md:7— assertion, attributed tocompile.ts→ corrected here18778-…md:11— assertion, attributed to the build command → corrected here18779-…md:52— "Also corrected: the sentence «…», which was false for as long as the key was positional" → quoted correction, untouchedThe one after is row 3. ✅ The only surviving hit in the whole population is
18779's quoted correction, which is what the claim comment asked to be shown rather than trusted.847e5773a. Ateec56c37dfit is 554. The tree moved; the count is re-measured here, ⛔ not inherited. The needle count is unchanged at 3, which is the number that matters.position-insensitive, not collision-proofreturned exactly 1 file (18779-…md), confirming the loop was reading real bytes at real paths — the failure mode the card records (a loop that double-prefixed.changeset/and returned a wholly convincing0).4.
.changeset/18779-…mdis untouched, and this PR makes its completeness claim true18779-…md:55-56claims the sentence "is now stated at the bound the pass can actually hold, in every file that carried it". That claim was false onorigin/main, falsified by the two rows above. It is true at this head. Measured over the whole tree, not just.changeset/— 9128 tracked text files at head, corrected normaliser, lit control 15 occurrences of the superset in 10 files:13 occurrences in 10 files, every one opened and classified. Zero are assertions.
.changeset/18779-per-package-dedup-positional-key.mdpackages/cli/src/commands/compile.ts×2packages/cli/src/utils/artifact-packages.ts×3:101), 1 historical account that names #18677 and #18778 by number as the two that quoted it, 1 prohibition ("⛔ do not restate it as that sentence")packages/cli/src/commands/lint.tspackages/cli/src/commands/validate.tspackages/cli/test/{lint,validate}-per-package-authoring-{parity,seam}.test.ts×4packages/cli/test/per-package-dedup-positional-echo.test.ts⇒ Nothing in the tree still asserts the sentence. Editing
18779-…mdwould be a no-op that spends a third file on the serial. ⛔ Left alone, exactly as ordered.5. ⭐ The written confirmation
Check Changesetroute 0 asks for — and why that check stays rednode scripts/check-empty-changeset.mjs --base origin/mainexits 1 here, and that is by design, ⛔ not a defect and ⛔ not a finding about the gate. The route-0 discriminator.github/workflows/pr-automation.ymlprescribes was run rather than reasoned about:Every row is
M, none isA⇒ the DELIBERATE CORRECTION class. The workflow's own instruction for it, verbatim:So, saying it, as the gate asks:
.changeset/18677-validate-per-package-authoring-pass.md(PR fix(cli):os validateruns the per-package author-time rule passos buildalready ran #18769's, amended by PR docs(cli): #18769's pending changeset declares theos validate --strictnarrowing an at-tier review exhibited #18867) and.changeset/18778-lint-per-package-authoring-pass.md(PR [finding]os lintis the THIRD door with the same union-only authoring-rule gap — #18677 closed two of three, and the card's own table said 2 of 2 #18778's). Both pending, both unreleased.compile.ts's own comment that the survivors are "exactly the set the union could not see" overstates what it keeps #18779, which neutralised the top-level collection index infindingKeyand in the same stroke retired the sentence both notes quote. Both notes were written before that landed and were never revisited; the source they cite was, and now prohibits the sentence by name.changeset-check("Require a changeset (or the skip-changeset label)") fails first — this PR adds no changeset of its own — which short-circuits the job, so the foreign-changeset refusal above never executes on CI at all.Check Changesetis not a required context, so its red blocks no merge and an approver merges over it. ⭐ Measured on the adjacent precedent rather than recalled: PR #18867's head1056c00195showsCheck Changeset= failure on both runs, its final label set isdocumentation, size/s, toolingwith noskip-changeset, and it merged. The route-0 block and ruling D are present inpr-automation.ymlat #18867's own merge commit03008c7e1a, so that ruling is not newer than the precedent.6. Verification
All 19 commands derived for this surface, re-derived at this head —
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, which reported--repo … checked against this checkout's 'origin' remote — it holds, change set2 path(s) vs merge base eec56c37d, and emitted exactly the 19 the dispatch named. Exit codes captured by redirecting first (⛔ never through a pipe).node scripts/check-adr-0087-registration.mjs --base origin/mainnode scripts/check-adr-0087-registration.mjs --self-testnode scripts/check-changeset-no-major.mjs --base origin/mainnode scripts/check-changeset-no-major.mjs --self-testnode scripts/check-closing-keyword-parity.mjsnode scripts/check-closing-keyword-parity.mjs --self-testnode scripts/check-comment-mask-corpus.mjsnode scripts/check-empty-changeset.mjs --base origin/mainnode scripts/check-empty-changeset.mjs --self-testnode scripts/pm/release-rehearsal-clone.mjs --self-testpnpm check:changeset-gate-self-testspnpm check:driver-memory-censuspnpm check:gitlink-declaredpnpm check:nul-bytespnpm check:objectui-changesetpnpm check:pm-changeset-deadline-censuspnpm check:published-filespnpm check:refd-timer-probepnpm check:watch-hint-literalGate 8's refusal names both files and the DELIBERATE CORRECTION class; §5 is its remedy. Gate 1 reads
.changeset/18677-…md [BREAKING] not-required (no-migration-prescription)— the disposition PR #18867 added survives this edit intact.Beyond the 19, run because the derivation refuses to call their silence a clearance:
node scripts/check-changeset-fixed.mjs— flagged ⛔ by the derivation, "roster under.changeset, which one of your paths is in"fixedgroup in sync with 70 public packagespnpm check:pm-governed-prosedocs/adr/**·.claude/**·skills/**·AGENTS.md·CLAUDE.md·docs/NORTH-STAR.md)..changeset/**is not among them, so no governed-surface obligations attach to this diffpnpm lint— whole repo,eslint . --no-inline-config, ⛔ not narrowed, so no narrowing argument is owed2babd18767grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]'over both changed filesNo package test or typecheck is owed and none is claimed. The diff touches no package source, no
exports, no spec contract, no built artefact and no test.turbo's affected set is empty of packages for a.changeset/*.mdedit; that is stated as "not owed", ⛔ not as "green".No changeset is owed for this PR. It declares no release of its own — route 0 above is the discriminator, and it also forbids the
skip-changesetlabel that would otherwise declare that in writing.No label is written by this PR, as ordered, and the order is independently correct: ruling D forbids
skip-changeseton exactly this class.7. Where this PR's reading differs from the dispatch order
⭐ Reported rather than silently accommodated, per the order's own instruction.
Clause-②: nois declared above exactly as the seat declared it, and this PR's reading of the finished diff agrees: prose in two unreleased notes, no export, no key, no member, no registration, no accept set moved in either direction.skip-changesethere by name. But "⇒ your round needs no label to go green" does not hold: PR docs(cli): #18769's pending changeset declares theos validate --strictnarrowing an at-tier review exhibited #18867, the precedent cited for it, went red onCheck Changesetand was merged over, as measured in §5. This round will be red too, and ⛔ that red is not "a real finding about the gate" — it is the gate's documented behaviour for this class, and §5 is the prose-and-person remedy it prescribes.18677's**BREAKING**section is untouched; the two entries needed one correction, not two.Boundaries — what this PR deliberately does not do
.changeset/18779-per-package-dedup-positional-key.md. §4 shows why that would be a no-op.packages/cli/src/**, any test,content/docs/releases/, or anypackages/*/CHANGELOG.md.Clause-②:line inside either changeset body.18778-…mdcarriesClause-②: yes (narrowing)at:36; that is a landed declaration about its own release and ⛔ not this card's to re-grade.Acceptance notes
.changeset/18677-…md:9-16pins a measurement toorigin/main 09e16a574—os build --json warnings: 4againstos validate --json warnings: 3— and [finding] the per-package de-duplication key is POSITIONAL, so echoes survive it — andcompile.ts's own comment that the survivors are "exactly the set the union could not see" overstates what it keeps #18779 has since moved that fixture's build count from 4 to 3. It is ⛔ not a defect: the reading is explicitly bound to a named sha, it was true there, and18779-…md:19-24publishes the 4→3 move in the same release, so a CHANGELOG reader gets both. Rewriting a correctly-dated historical measurement would be the larger error. Carrier: none — no PR is in flight on that file and none is predicted; recorded here because the "somebody will touch this anyway" fallback ⛔ does not hold for.changeset/*.\s+without first stripping block-comment continuation markers. That is a fact about a throwaway script in this session, ⛔ not about any tracked file — no gate, helper or committed tool has the defect. It is written down because the card's own history records the opposite failure of the same instrument class (a convincing0), and the pair is the argument for the lit control. Carrier: none; nothing in the repo carries this code.Generated by Claude Code